package current.limiting.annotions;

import current.limiting.commom.enumerate.DealType;
import current.limiting.commom.enumerate.LimitType;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

import static current.limiting.commom.constant.CurrentLimitConstant.EMPTY;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 接口限流注解
 *
 * @author LiKun
 * @date 2021/10/25 10:44
 */
@Documented
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Limiting {
    /**
     * 限流标识(可以不唯一)
     *
     * @return 限流标识
     */
    String value() default EMPTY;

    /**
     * 接口限流时间计算的数值(0：不限流)
     *
     * @return 时间数值
     */
    long limitTime() default 0L;

    /**
     * BLOCKING 模式下的阻塞时间 (0：一直阻塞)
     *
     * @return 阻塞时间
     */
    long blockTime() default 0L;

    /**
     * 给定时间段内允许通过的请求数量(0：无数量限制)
     *
     * @return 允许通过的请求数量
     */
    long accessQuantity() default 0L;

    /**
     * 接口限流的方式
     *
     * @return 限流方式
     */
    LimitType limitType() default LimitType.QPS;

    /**
     * 接口限流的处理方式
     *
     * @return 限流处理方式
     */
    DealType dealType() default DealType.BLOCKING;

    /**
     * 接口限流时间/阻塞时间的单位
     *
     * @return 时间单位
     */
    TimeUnit timeUnit() default TimeUnit.MILLISECONDS;
}
